home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
pascal
/
gsdbloo.exe
/
GS_FILEH.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-02-24
|
11KB
|
417 lines
unit GS_FileH;
{------------------------------------------------------------------------------
File Handler
Copyright (c) Richard F. Griffin
20 February 1992
102 Molded Stone Pl
Warner Robins, GA 31088
-------------------------------------------------------------
This unit handles all untyped files. Also provides file directory
search and selection.
Since all calls come through here for untyped files, this is a point
to trap the calls in the future for shared file handling.
Changes:
19 Feb 92 - Deleted buffering to speed indexed retrievals.
------------------------------------------------------------------------------}
interface
{$d-}
uses
CRT,
Dos,
GS_Strng,
GS_Error;
var
GS_FileDrvTab : array[0..127] of char;
GS_FileDrvCnt : byte;
BRCmd,
BWCmd,
IOAsk,
IORed,
IOWri,
IOPhy : word;
Procedure GS_FileAssign(var dF : file; Fname : string);
Procedure GS_FileClose(var dF : file);
Procedure GS_FileErase(var dF : file);
Function GS_FileExists(var dF : file; Fname : string) : boolean;
Procedure GS_FileRead(var dF : file; blk : longint; var dat; len : longint;
var RtnRslt : word);
Procedure GS_FileRename(var dF : file; FName : string);
Procedure GS_FileReset(var dF : file; len : longint);
Procedure GS_FileRewrite(var dF : file; len : longint);
Function GS_FileSize(var dF : file) : longint;
Procedure GS_FileTruncate(var dF : file; loc : longint);
Procedure GS_FileWrite(var dF : file; blk : longint; var dat; len : longint;
var RtnRslt : word);
function GS_FileFindFiles(pth, fname : string; LookElseWhere : boolean)
: string;
implementation
uses
GS_Pick,
GS_Winfc;
type
BufrRec = record
Size : word; {Size of buffer}
CntByt : word; {Bytes stores in buffer}
Posn : longint; {Beginning byte of file in buffer}
FPosn : longint; {Last byte read + 1 in buffer}
BufPtr : Pointer;
end;
var
Bufr : BufrRec;
dbfErr : integer;
Blok,
TPosS,
TPosE : longint;
StrFil : string[80];
istrue : boolean;
cdriv : byte;
tdrv : byte;
regs : Registers;
ShoWin : GS_Wind_Objt;
Procedure GS_FileAssign(var dF : file; Fname : string);
var
dFa : FileRec absolute dF;
begin
Assign(df, FName);
Bufr.Posn := -1;
Bufr.FPosn := 0;
Bufr.CntByt := 0;
Bufr.Size := 0;
Bufr.BufPtr := nil;
move(Bufr, dFa.UserData, sizeof(Bufr));
end;
Procedure GS_FileClose(var dF : file);
var
dFa : FileRec absolute dF;
begin
Close(df);
end;
Procedure GS_FileErase(var dF : file);
begin
Erase(df);
end;
Function GS_FileExists(var dF : file; Fname : string) : boolean;
begin
if (FName <> '') then
begin
{$I-}
Assign(dF, FName);
Reset(dF);
Close(dF);
{$I+}
GS_FileExists := (IOResult = 0);
end else GS_FileExists := false;
end;
Procedure GS_FileRead(var dF : file; blk : longint; var dat; len : longint;
var RtnRslt : word);
var
dFa : FileRec absolute dF;
Result : word;
StrFil : string[80];
begin
move(dFa.UserData, Bufr, sizeof(Bufr));
if blk = -1 then blk := succ(Bufr.Posn);
dbfErr := 0;
begin
(*$I-*) Seek(dF, blk); (*$I+*)
dbfErr := IOResult;
end;
IF dbfErr = 0 THEN {If seek ok, read the record}
BEGIN
inc(BRCmd);
(*$I-*)
BlockRead(dF, dat, len, Result);
(*$I+*)
RtnRslt := Result;
dbfErr := IOResult;
if dbfErr = 0 then
begin
Bufr.Posn := blk + (len-1);
move(Bufr, dFa.UserData, sizeof(Bufr));
end;
end;
if dbfErr <> 0 then
begin
CnvAscToStr(dFa.Name,StrFil,64);
ShowError(dbfErr,StrFil);
end;
end;
Procedure GS_FileRename(var dF : file; Fname : string);
begin
Rename(df, FName);
end;
Procedure GS_FileReset(var dF : file; len : longint);
var
dFa : FileRec absolute dF;
StrFil : string[80];
begin
(*$I-*) Reset(dF, len); (*$I+*)
dbfErr := IOResult;
if dbfErr <> 0 then
begin
CnvAscToStr(dFa.Name,StrFil,64);
ShowError(dbfErr,StrFil);
end;
end;
Procedure GS_FileRewrite(var dF : file; len : longint);
var
dFa : FileRec absolute dF;
StrFil : string[80];
begin
(*$I-*) Rewrite(dF, len); (*$I+*)
dbfErr := IOResult;
if dbfErr <> 0 then
begin
CnvAscToStr(dFa.Name,StrFil,64);
ShowError(dbfErr,StrFil);
end;
end;
Function GS_FileSize(var dF : file) : longint;
begin
GS_FileSize := FileSize(df);
end;
Procedure GS_FileTruncate(var dF : file; loc : longint);
var
dFa : FileRec absolute dF;
begin
move(dFa.UserData, Bufr, sizeof(Bufr));
if loc = -1 then loc := succ(Bufr.Posn);
dbfErr := 0;
(*$I-*) Seek(dF, loc); (*$I+*)
dbfErr := IOResult;
if dbfErr <> 0 then
begin
CnvAscToStr(dFa.Name,StrFil,64);
ShowError(dbfErr,StrFil);
end;
Truncate(df);
Bufr.Posn := loc;
move(Bufr, dFa.UserData, sizeof(Bufr));
end;
Procedure GS_FileWrite(var dF : file; blk : longint; var dat; len : longint;
var RtnRslt : word);
var
dFa : FileRec absolute dF;
Result : word;
StrFil : string[80];
begin
move(dFa.UserData, Bufr, sizeof(Bufr));
if blk = -1 then blk := succ(Bufr.Posn);
dbfErr := 0;
(*$I-*) Seek(dF, blk); (*$I+*)
dbfErr := IOResult;
IF dbfErr = 0 THEN {If seek ok, read the record}
BEGIN
(*$I-*) BlockWrite(dF, dat, len, Result); (*$I+*)
RtnRslt := Result;
dbfErr := IOResult;
IF dbfErr = 0 THEN {If seek ok, read the record}
BEGIN
Bufr.Posn := blk + (len-1);
move(Bufr, dFa.UserData, sizeof(Bufr));
end;
end;
if dbfErr <> 0 then
begin
CnvAscToStr(dFa.Name,StrFil,64);
ShowError(dbfErr,StrFil);
end;
end;
function GS_FileFindFiles(pth, fname : string; LookElseWhere : boolean)
: string;
var
DirInfo : SearchRec;
FilTabl : array[1..512] of string[12];
Labl : string;
DirNow,
DirNam,
DirCur : PathStr;
DSt : DirStr;
NSt : NameStr;
ESt : ExtStr;
itms : integer;
rfil : integer;
rdir : integer;
slct : integer;
lctn : integer;
wtx,
wbg,
wfg,
wti,
wbi : byte;
wx1,
wy1,
wx2,
wy2 : integer;
procedure MakeFileTable;
var
i : integer;
d : string;
v : char;
u : byte absolute v;
b : byte;
begin
itms := 0;
FindFirst(Labl, Archive, DirInfo);
while DosError = 0 do
begin
inc(itms);
FilTabl[itms] := DirInfo.Name;
FindNext(DirInfo);
end;
rfil := itms;
if itms > 0 then
GS_Pick_Item_Sort(FilTabl[1],sizeof(FilTabl[1]),itms,true);
if LookElseWhere then
begin
FindFirst('*.', Directory, DirInfo);
while DosError = 0 do
begin
if (DirInfo.Attr = directory) and (DirInfo.Name <> '.') then
begin
inc(itms);
for i := 1 to length(DirInfo.Name) do
begin
v := DirInfo.Name[i];
if v in ['A'..'Z'] then u := u + 32;
DirInfo.Name[i] := v;
end;
FilTabl[itms] := DirInfo.Name+'\';
end;
FindNext(DirInfo);
end;
rdir := itms;
if itms-rfil > 0 then
GS_Pick_Item_Sort(FilTabl[succ(rfil)],sizeof(FilTabl[1]),
itms-rfil,true);
for i := 0